﻿// CPopSpeaker.cpp: 实现文件
//

#include "pch.h"
#include "DntDemo.h"
#include "afxdialogex.h"
#include "CPopSpeaker.h"
#include "CTabAudioKc3x.h"
#define TAG			"Speaker"


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 标准C语言函数 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CPopSpeaker* mPopSpeaker = NULL;
static void changRegCallback() {
	if (mPopSpeaker != NULL) {
		mPopSpeaker->ShowRegister();
	}
}
void writeSpkConfig(uint8_t value) {
	mKc3x->SpkConfig = value;
	if (DntRegWrite()) {				// 写寄存器
		isPopKc3xRegi = true;
	}
	else {
		CLOGE(TAG, "write SpkConfig Error %02x", value);
	}
}

int CPopSpeaker::ShowSlider(uint8_t value, int slider, int edit) {			// 显示数值
	CString text;
	text.Format(L"%dHz", value);
	((CStatic*)GetDlgItem(edit))->SetWindowText(text);
	return value;
}

void CPopSpeaker::SetFrequencyValue(int slider, int edit) {				// 读取选项的状态值
	int position = ((CSliderCtrl*)GetDlgItem(slider))->GetPos();
	CLOGE(TAG, "SetFrequencyValue 显示AAA (%d)", position);
	switch (slider) {
	case IDC_SLIDER_SW_FREQUENCY:			// 超低音频率
		gLpValue = position;				// 超低音频率
		break;
	case IDC_SLIDER_SMALL_FREQUENCY:		// 小喇叭频率
		gHpValue = position;				// 小喇叭频率
		break;
	}
	ShowSlider(position, slider, edit);
	gSlowTime = 3;
}

void CPopSpeaker::ShowSpeaker(int value, int id0, int id1, int id2) {	// 显示被选择在选项
	if (value == 0) {
		((CButton*)GetDlgItem(id0))->SetCheck(TRUE);
		((CButton*)GetDlgItem(id1))->SetCheck(FALSE);
		if (id2 != 0) {
			((CButton*)GetDlgItem(id2))->SetCheck(FALSE);
		}
		return;
	}
	if (value == 1) {
		((CButton*)GetDlgItem(id0))->SetCheck(FALSE);
		((CButton*)GetDlgItem(id1))->SetCheck(TRUE);
		if (id2 != 0) {
			((CButton*)GetDlgItem(id2))->SetCheck(FALSE);
		}
		return;
	}
	if (value == 2) {
		((CButton*)GetDlgItem(id0))->SetCheck(FALSE);
		((CButton*)GetDlgItem(id1))->SetCheck(FALSE);
		if (id2 != 0) {
			((CButton*)GetDlgItem(id2))->SetCheck(TRUE);
		}
	}
}
int CPopSpeaker::GetSpeaker(int id0, int id1, int id2) {		// 读取选项的状态值
	int v1 = ((CButton*)GetDlgItem(id1))->GetCheck();
	int v2 = id2 ? ((CButton*)GetDlgItem(id2))->GetCheck() : 0;
	return v2 ? 2 : v1 ? 1 : 0;
}
void CPopSpeaker::ShowRegister() {
	int woofer = (mKc3x->SpkConfig & 0x01);				// 超低音 找第一位数是否是0
	ShowSpeaker(woofer, IDC_RADIO_SW_CLOSE, IDC_RADIO_SW_OPEN, 0);
	
	int fornt = ((mKc3x->SpkConfig >> 1) & 0x01);		// 前置  移动1位后，看b0的数值
	ShowSpeaker(fornt, IDC_RADIO_FL_SMALL, IDC_RADIO_FL_BIG, 0);

	int center = ((mKc3x->SpkConfig >> 2) & 0x03);		// 中置  移动2位后，看b0和b1的数值
	ShowSpeaker(center, IDC_RADIO_CE_CLOSE, IDC_RADIO_CE_SMALL, IDC_RADIO_CE_BIG);

	int surround = ((mKc3x->SpkConfig >> 4) & 0x03);	// 环绕  移动4位后，看b0和b1的数值
	ShowSpeaker(surround, IDC_RADIO_SL_CLOSE, IDC_RADIO_SL_SMALL, IDC_RADIO_SL_BIG);

	int Rear = ((mKc3x->SpkConfig >> 6) & 0x03);		// 后置  移动6位后，看b0和b1的数值
	ShowSpeaker(Rear, IDC_RADIO_BL_CLOSE, IDC_RADIO_BL_SMALL, IDC_RADIO_BL_BIG);

	int position1 = ShowSlider(mKc3x->LpfFreq, IDC_SLIDER_SW_FREQUENCY, IDC_SW_FREQUENCY_VALUE);		// 超低音频率
	int position2 = ShowSlider(mKc3x->HpfFreq, IDC_SLIDER_SMALL_FREQUENCY, IDC_SMALL_FREQUENCY_VALUE);	// 小喇叭频率
	if (gSlowTime == 0) {		// 拉动滑块松手后才SetPos数值，防止拉动滑块反复跳动
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_SW_FREQUENCY))->SetPos(position1);		// 超低音频率
		((CSliderCtrl*)GetDlgItem(IDC_SLIDER_SMALL_FREQUENCY))->SetPos(position2);	// 小喇叭频率
	}
}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// C++语言对话框函数 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// CPopSpeaker 对话框

IMPLEMENT_DYNAMIC(CPopSpeaker, CDialogEx)

CPopSpeaker::CPopSpeaker(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_POP_SPEAKER, pParent){
}

CPopSpeaker::~CPopSpeaker(){
}

void CPopSpeaker::DoDataExchange(CDataExchange* pDX){
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CPopSpeaker, CDialogEx)
	ON_WM_TIMER()
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_SMALL_FREQUENCY, &CPopSpeaker::OnNMCustomdrawSliderSmallFrequency)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_SW_FREQUENCY, &CPopSpeaker::OnNMCustomdrawSliderSwFrequency)
END_MESSAGE_MAP()

// CPopSpeaker 消息处理程序
BOOL CPopSpeaker::OnInitDialog(){
	CDialogEx::OnInitDialog();
	// TODO:  在此添加额外的初始化

	((CSliderCtrl*)GetDlgItem(IDC_SLIDER_SMALL_FREQUENCY))->SetRange(0, 250);	// 设置最小值和最大值
	((CSliderCtrl*)GetDlgItem(IDC_SLIDER_SW_FREQUENCY))->SetRange(0, 250);		// 设置最小值和最大值

	mPopSpeaker = this;
	isPopKc3xRegi = false;
	gSlowTime = 0;
	gLpValue = 0;
	gHpValue = 0;
	ShowRegister();
	TestChangRegCallback(changRegCallback);
	SetTimer(1, 300, NULL);
	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

void CPopSpeaker::OnTimer(UINT_PTR nIDEvent){
	if (mKc3x->LpfFreq != gLpValue) {						// 如果判断mKc3x->LpfFreq与gLpValue数据不同
		mKc3x->LpfFreq = gLpValue;							// 把数据gLpValue复制到&mKc3x->LpfFreq中
		isPopKc3xRegi = true;								// 允许写入寄存器的标志
	}
	if (mKc3x->HpfFreq != gHpValue) {						// 如果判断mKc3x->HpfFreq与gHpValue数据不同
		mKc3x->HpfFreq = gHpValue;							// 把数据gHpValue复制到&mKc3x->HpfFreq中
		isPopKc3xRegi = true;								// 允许写入寄存器的标志
	}

	if (isPopKc3xRegi) {
		isPopKc3xRegi = false;
		uint8_t saveLp;
		uint8_t saveHp;
		saveLp = gLpValue;									// 把gLpValue复制到saveLp中，防止拉动滑块过程中数值反复跳动
		saveHp = gHpValue;									// 把gHpValue复制到saveHp中，防止拉动滑块过程中数值反复跳动
		ShowRegister();
		gLpValue = saveLp;
		gHpValue = saveHp;
		DntRegWrite();										// 写寄存器
	}

	uint8_t spkConfig = 0;																// 喇叭设置
	int woofer = GetSpeaker(IDC_RADIO_SW_CLOSE, IDC_RADIO_SW_OPEN, 0);					// 超低音
	if (woofer != 0) {			// 有超低音
		spkConfig |= 0x01;
	}

	int fornt = GetSpeaker(IDC_RADIO_FL_SMALL, IDC_RADIO_FL_BIG, 0);					// 前置
	if (fornt != 0) {			// 前置大喇叭
		spkConfig |= 0x02;
	}

	int center = GetSpeaker(IDC_RADIO_CE_CLOSE, IDC_RADIO_CE_SMALL, IDC_RADIO_CE_BIG);	// 中置
	if (center == 1) {			// 中置小喇叭
		spkConfig |= 0x04;
	}else if (center == 2) {	// 中置大喇叭
		spkConfig |= 0x08;
	}

	int surround = GetSpeaker(IDC_RADIO_SL_CLOSE, IDC_RADIO_SL_SMALL, IDC_RADIO_SL_BIG);// 环绕
	if (surround == 1) {		// 环绕小喇叭
		spkConfig |= 0x10;
	}else if (surround == 2) {  // 环绕大喇叭
		spkConfig |= 0x20;
	}

	int Rear = GetSpeaker(IDC_RADIO_BL_CLOSE, IDC_RADIO_BL_SMALL, IDC_RADIO_BL_BIG);	// 后置
	if (Rear == 1) {			// 后置小喇叭
		spkConfig |= 0x40;
	}else if (Rear == 2) {		// 后置大喇叭
		spkConfig |= 0x80;
	}
	if (mKc3x->SpkConfig != spkConfig) {
		writeSpkConfig(spkConfig);
	}
	
	if (gSlowTime) {
		--gSlowTime;
	}
	CDialogEx::OnTimer(nIDEvent);
}

void CPopSpeaker::OnNMCustomdrawSliderSwFrequency(NMHDR* pNMHDR, LRESULT* pResult) {	// 超低音频率
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	SetFrequencyValue(IDC_SLIDER_SW_FREQUENCY, IDC_SW_FREQUENCY_VALUE);
	*pResult = 0;
}

void CPopSpeaker::OnNMCustomdrawSliderSmallFrequency(NMHDR* pNMHDR, LRESULT* pResult){	// 小喇叭频率
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	SetFrequencyValue(IDC_SLIDER_SMALL_FREQUENCY, IDC_SMALL_FREQUENCY_VALUE);
	*pResult = 0;
}